/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.vistas;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import org.marcelo.agro.entidades.*;
import org.marcelo.agro.core.ComboEnBackground;
import org.marcelo.agro.core.api.InterfaceActividades;
import org.knolle.validadores.ValidadorNumeros;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.util.Lookup;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;

/**
 * Top component which displays something.
 */
//@ConvertAsProperties(dtd = "-//org.knolle.vistas//AddActividades2//EN",
//autostore = false)
//@TopComponent.Description(preferredID = "PanelAgregarActividades",
////iconBase="SET/PATH/TO/ICON/HERE", 
//persistenceType = TopComponent.PERSISTENCE_ALWAYS)
//@TopComponent.Registration(mode = "properties", openAtStartup = false)
//@ActionID(category = "Window", id = "org.knolle.vistas.PanelAgregarActividades")
//@ActionReference(path = "Menu/Window" /*
// * , position = 333
// */)
//@TopComponent.OpenActionRegistration(displayName = "#CTL_AddActividades2Action",
//preferredID = "PanelAgregarActividades")
//@Messages({
//    "CTL_AddActividades2Action=AddActividades2",
//    "CTL_AddActividades2TopComponent=AddActividades2 Window",
//    "HINT_AddActividades2TopComponent=Esta es la ventana Agregar o Editar Actividades"
//})

/**
 * La ventana de actividades Debe cumplir estos requerimientos:
 * 1) Seleccionar la fecha: El campo fecha no debe ser nulo,
 * 2) Seleccionar la actividad: Al seleccionar la actividad se deben setear los campos requeridos, tambien se debe cargar el combo
 * tipo actividad y setearlo en enabled true;
 * 3) Seleccionar el tipo de actividad, al seleccionar el tipo de actividad se debe habilitar el campo producto.
 * 4) Buscar el producto, si producto es requerido entonces no dejar que el usuario salga de ese campo hasta que este cargado el dato
 * 5) Cargar el campo control
 * 6) Cargar el campo Dosis
 * 7) Cargar el campo Superficie, este campo debe estar seteado con los valores por defecto del lote
 */

public final class PanelAgregarActividades extends javax.swing.JPanel implements ActionListener  {
    
    
    //Crear un lookup y y Hacer que la vista actividedes escuche sus cambios
    //Creo que voy a utilizar un lookup global para toda la aplicacion entonces todos podran utilizar el mismo lookup
    //y desde alli notar los cambios en el entorno, voy a ver que onda
    InstanceContent content = new InstanceContent();
    Lookup lookup = new AbstractLookup(content);
    //Ventana de seleccion producto
    private PanelSeleccionarProducto spp = new PanelSeleccionarProducto();
    //Campo Actividad
    private Actividades actividad;
    //Campo producto
    private Productos producto; 
    
    InterfaceActividades ia = Lookup.getDefault().lookup(InterfaceActividades.class);
    //Variables Finales, para validar los datos ingresados por el usuario
    private static final int MAX_LENTGH_COMENTARIO = 1024;
    private static final int MAX_LENTGH_CONTROL = 512;
    private static final int MAX_LENTGH_NOMBRE_PRODUCTO = 512;
    //Los Campos Precio, Dosis y Superfie, los limites de ambos deben ser Big_Decimal
    
    //Campos para los mensajes de los dialogos, la idea es internacionalizar los mensajes, al inicializar la app
    private static final String MENSAJE_PRODUCTO_NO_SELECCIONADO = "No se selecciono ningun producto";
    private static final String MENSAJE_SELECCION_CANCELADA = "Seleccion cancelada!!!";
    private static final String TITULO_BUSCAR_PRODUCTO = "Buscar producto";
    
    
    
    public PanelAgregarActividades() {
        initComponents();
//        setName(Bundle.CTL_AddActividades2TopComponent());
//        setToolTipText(Bundle.HINT_AddActividades2TopComponent());
        actividad = new Actividades();
        setearVerificadores();
        
    }
    
    /**
     * Aqui voy a setear todos los campos que necesitan ser verificados
     * Los campos Dosis, precio y superficie solo pueden ser numericos y solo positivos
     */
    private void setearVerificadores(){
       this.CampoDosis.setInputVerifier(new ValidadorNumeros(this, CampoDosis, "", true));
       this.CampoSuperficie.setInputVerifier(new ValidadorNumeros(this, CampoSuperficie, "", true));
       this.CampoPrecio.setInputVerifier(new ValidadorNumeros(this, CampoPrecio, "", true));
    
    }
    
    
    /**
     * Validar el formulario, mostrando los mensajes de error que correspondan.
     * La longitud de los campos
     * Se debe verificar que el precio y la dosis no sean negativas
     * Se debe chequear que si seeligio una actividad se tiene que chequear el combo CampoTipoProducto
     * Si el campo tipoProducto requiere un producto entonces el campo producto es requerido
     * Mano de Obra y debe filtrar el COmboTipoProducto con las Opciones de Mano de Obra
     * Opciones de Mano de Obra son 
     *      Sembrar
     *      Pulverizar
     *      Fumigar
     *      Cosechar
     *      Si esta en una de estas opciones el campo producto y el campo dosis queda deshabilitado y seteado su valor a 
     *      uno, cuando se cambia el valor del los combos se habilita las opciones y se permite ingresar los trabajos,
     *      permitir agregar mas desde alli?
     */
    private void validar(){
       
    }
    /**
     * Crear el Panel para agregar o editar actividades, luego de realizar los cambios meter los datos al lookup
     * y lanzar el evento para que se redibuje la tabla, y otros eventos relacionados
     * @param actividad 
     */
    public PanelAgregarActividades(Actividades actividad) {
        this.actividad = actividad; 
        
        
        initComponents();
        //Cargar datos sera colocado en un runnable, que se invocara luego
        cargarDatos(); 
        setearVerificadores();
        
        //associateLookup(ExplorerUtils.createLookup(em, getActionMap()));
    }
    
    /**
     *Metodos para setear los datos en los componentes de la vista 
     */
    private void cargarDatos(){
        
        //Seteando los combos
//        Si los datos son nulos sera un problema
        this.comboTipoActividad.getModel().setSelectedItem(actividad.getTipoActividad());
        try{
            this.comboTipoProducto.getModel().setSelectedItem(actividad.getTipoProducto());
        }
        catch (NullPointerException npe) { //ignorar o ?
        
        }
        this.comboUnidadDosis.getModel().setSelectedItem(actividad.getUnidadMedidaDosis());
//      this.CampoUnidadSuperficie.getModel().setSelectedItem(actividad.getUnidadMedidaSuperficie());
        //Seteando los campos comunes
        this.CampoFecha.setDate(actividad.getFecha());
        //Cargar los datos a Productos
        producto = actividad.getProductos();
        this.CampoProducto.setText(null != producto? producto.getNombre()+", "+producto.getTipoProducto():"");
        this.CampoControl.setText(actividad.getControl());
        this.CampoPrecio.setText(null != actividad.getPrecioUnitario()?actividad.getPrecioUnitario().toString(): "0" );
        this.CampoDosis.setText(null != actividad.getDosis()?actividad.getDosis().toString():"0");
        this.CampoSuperficie.setText(null != actividad.getSuperficie()?actividad.getSuperficie().toString(): "0");
        this.CampoComentarios.setText(actividad.getComentarios());   
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        Date fechaHoy = new Date();
        CampoFecha = new org.jdesktop.swingx.JXDatePicker(fechaHoy);
        jLabel1 = new javax.swing.JLabel();
        //Obteniendo los datos para el combo
        List<TipoActividad> tipoActividadList = ia.getTiposActividades();
        //Creando el model para asignar los datos
        DefaultComboBoxModel tipoActividadComboModel = new DefaultComboBoxModel();
        //Cargando los datos al comboBox
        for (TipoActividad ta : tipoActividadList) {
            tipoActividadComboModel.addElement(ta);
        }
        comboTipoActividad = new javax.swing.JComboBox();
        //Los datos para el combo
        comboTipoProducto = new javax.swing.JComboBox();
        CampoProducto = new javax.swing.JTextField();
        btSeleccionarProducto = new javax.swing.JButton();
        CampoControl = new javax.swing.JTextField();
        CampoDosis = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        //Creando la lista de datos
        List<UnidadMedidaDosis> unidadDosisList = ia.getUnidadMedidaDosis();
        DefaultComboBoxModel dosisComboModel = new DefaultComboBoxModel();

        for(UnidadMedidaDosis ud: unidadDosisList){
            dosisComboModel.addElement(ud);
        }
        comboUnidadDosis = new javax.swing.JComboBox();
        jLabel7 = new javax.swing.JLabel();
        CampoSuperficie = new javax.swing.JTextField();
        jSeparator1 = new javax.swing.JSeparator();
        jScrollPane1 = new javax.swing.JScrollPane();
        CampoComentarios = new javax.swing.JTextArea();
        jLabel8 = new javax.swing.JLabel();
        CampoPrecio = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        jSpinner1 = new javax.swing.JSpinner();

        CampoFecha.setFormats("dd-MM-yyyy");

        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel1.text")); // NOI18N

        //Seteando los datos al combo
        comboTipoActividad.setModel(tipoActividadComboModel);
        //Agregar el Listener para que escuche cambios en el combo
        comboTipoActividad.addItemListener(
            new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        if (e.getItem() instanceof TipoActividad)
                        cargarComboTipoProducto( (TipoActividad) e.getItem() );
                    }
                }
            }
        );

        //Asignando los datos al combo

        CampoProducto.setEditable(false);
        CampoProducto.setText(org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.CampoProducto.text")); // NOI18N
        CampoProducto.setFocusable(false);

        btSeleccionarProducto.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/marcelo/agro/campanias/recursos/Magnifier_24x24.png"))); // NOI18N
        org.openide.awt.Mnemonics.setLocalizedText(btSeleccionarProducto, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.btSeleccionarProducto.text")); // NOI18N
        btSeleccionarProducto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSeleccionarProductoActionPerformed(evt);
            }
        });

        CampoControl.setText(org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.CampoControl.text")); // NOI18N

        CampoDosis.setText(org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.CampoDosis.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel2.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel3.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel4.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel5.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel6.text")); // NOI18N

        //Asignando los datos al combo
        comboUnidadDosis.setModel(dosisComboModel);

        org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel7.text")); // NOI18N

        CampoSuperficie.setText(org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.CampoSuperficie.text")); // NOI18N

        CampoComentarios.setColumns(20);
        CampoComentarios.setRows(5);
        jScrollPane1.setViewportView(CampoComentarios);

        org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel8.text")); // NOI18N

        CampoPrecio.setText(org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.CampoPrecio.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(jLabel9, org.openide.util.NbBundle.getMessage(PanelAgregarActividades.class, "PanelAgregarActividades.jLabel9.text")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 321, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel7)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2)
                            .addComponent(jLabel3)
                            .addComponent(jLabel4)
                            .addComponent(jLabel5)
                            .addComponent(jLabel6)
                            .addComponent(jLabel9))
                        .addGap(29, 29, 29)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(CampoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btSeleccionarProducto))
                            .addComponent(CampoFecha, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(comboTipoActividad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(comboTipoProducto, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(CampoControl)
                            .addComponent(CampoPrecio)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(CampoDosis, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(CampoSuperficie, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(comboUnidadDosis, 0, 91, Short.MAX_VALUE)
                                    .addComponent(jSpinner1)))))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel8)
                        .addGap(27, 27, 27)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(0, 33, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(CampoFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(comboTipoActividad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(comboTipoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btSeleccionarProducto)
                    .addComponent(jLabel4))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoControl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(CampoPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoDosis, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(comboUnidadDosis, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CampoSuperficie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7)
                    .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(jLabel8)))
                .addContainerGap(29, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btSeleccionarProductoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSeleccionarProductoActionPerformed
        // TODO add your handling code here:
//        NewOkCancelDialog okDialog = new NewOkCancelDialog(new javax.swing.JFrame() , true);
        DialogDescriptor dd = new DialogDescriptor(spp, TITULO_BUSCAR_PRODUCTO, true, null);    
//        dd.addPropertyChangeListener(
//            new PropertyChangeListener() {
//                @Override
//                public void propertyChange(PropertyChangeEvent evt) {
////                    throw new UnsupportedOperationException("Not supported yet.");
//                      if(evt.getPropertyName().equals(DialogDescriptor.PROP_VALUE) && evt.getNewValue() == DialogDescriptor.OK_OPTION){
//                          DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("Datos Ingresados"));
//                          actividad.setProductos( spp.getProducto());
//                      }
//                }
//            }
//        );
        if (DialogDisplayer.getDefault().notify(dd) == DialogDescriptor.OK_OPTION ){
            if ( null != spp.getProducto()  ){
                producto = spp.getProducto(); 
                this.CampoProducto.setText( producto.getNombre());
            }
            else{
                JOptionPane.showMessageDialog(this,MENSAJE_PRODUCTO_NO_SELECCIONADO);
            }    
        }
        else {
            JOptionPane.showMessageDialog(this,MENSAJE_SELECCION_CANCELADA);
        }
//          okDialog.setVisible(true);        
        
        
    }//GEN-LAST:event_btSeleccionarProductoActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextArea CampoComentarios;
    private javax.swing.JTextField CampoControl;
    private javax.swing.JTextField CampoDosis;
    private org.jdesktop.swingx.JXDatePicker CampoFecha;
    private javax.swing.JTextField CampoPrecio;
    private javax.swing.JTextField CampoProducto;
    private javax.swing.JTextField CampoSuperficie;
    private javax.swing.JButton btSeleccionarProducto;
    private javax.swing.JComboBox comboTipoActividad;
    private javax.swing.JComboBox comboTipoProducto;
    private javax.swing.JComboBox comboUnidadDosis;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSpinner jSpinner1;
    // End of variables declaration//GEN-END:variables
//    @Override
//    public void componentOpened() {
//        // TODO add custom code on component opening
//        cargarDatos();
//        
//    }

//    @Override
//    public void componentClosed() {
//        // TODO add custom code on component closing
//    }

    void writeProperties(java.util.Properties p) {
        // better to version settings since initial version as advocated at
        // http://wiki.apidesign.org/wiki/PropertyFiles
        p.setProperty("version", "1.0");
        // TODO store your settings
    }

    void readProperties(java.util.Properties p) {
        String version = p.getProperty("version");
        // TODO read your settings according to their version
    }
    
    
    private void cargarComboTipoProducto(final TipoActividad ta) {
        
        ComboEnBackground<TipoProducto> worker = new ComboEnBackground<TipoProducto>(comboTipoProducto, Boolean.FALSE, actividad.getTipoProducto()) {

            @Override
            public List<TipoProducto> getDatos() {
//                InterfaceActividades ia = Lookup.getDefault().lookup(InterfaceActividades.class);
                return ia.getTiposProductos(ta);
            }
        };
        worker.execute();
        
    }
    
//    private void asyncCampoTipoProducto(ItemEvent e){
//        //Buscar los productos en base al tipo de trabajo
//        List<TipoProducto> tipoProductoList = ControllerActividades.getTipoProductos();
//        //Creando el Model
//        DefaultComboBoxModel comboTipoProductoModel = new DefaultComboBoxModel();
//        //Cargando los datos al model
//        for(TipoProducto tp : tipoProductoList ){
//            comboTipoProductoModel.addElement(tp);
//        }
//        comboTipoProducto.setModel(comboTipoProductoModel);
//
//    }

    @Override
    public void actionPerformed(ActionEvent e) {
        /**
        * Primero verificar que el boton fue el boton OK
        * si el boton fue el OK hacer:
        * Verificar los campos:
        * Guardar los datos
        * Si NO guardo mostrar mensaje con el error
        */
        if (e.getSource() == DialogDescriptor.OK_OPTION) {
           //Validar campos
            //Todavia no valida
           //Si validacion OK => Cargar Datos en Objeto
            componentToPojo();
            try { 
                ia.saveOrUpdate(actividad); 
                //Se podria mostrar en la barra de estado que se guardo;
                //Aca debo ver como hago para lanzar el evento que hace que todo se repinte
                //Esta complicado, Tambien hay un bug al comenter un error en la validacion y presionar cancel
                //Sigue mostrando el mensaje modal, no desaparece aunque el componente no este visible
                //Debo forzar la recarga de toda la tabla para poder ver bien
                LotesPorCampana lpc = new LotesPorCampana(actividad.getCampanas(), actividad.getLotes());
                content.set(Collections.singleton(lpc),null); 
//                content.add(actividad);
            }
            catch (Exception exception) {
                //Mostrar la excepcion
                JOptionPane.showMessageDialog(null,"No se pudo guardar por: ");
            }
        }
        else if(e.getSource() == DialogDescriptor.CANCEL_OPTION) {
            //Se preciono cancel, pueden haber muchos mensajes de error entonces debo hacer que desaparescan lanzando un mensaje de teclado
            JOptionPane.showMessageDialog(null,"Cancelando, Cerrar todos los errores ");
        }
        
    }
    
    /**
     * Metodo para cargar los datos en el Objeto, obtener todos los controles y setearlos al objeto
     * Este metodo debe ser invocado despues de validar todos los campos
     * 
     */
    private void componentToPojo(){
        
        actividad.setTipoActividad((TipoActividad)comboTipoActividad.getModel().getSelectedItem());
        actividad.setTipoProducto((TipoProducto) comboTipoProducto.getModel().getSelectedItem());
        actividad.setUnidadMedidaDosis((UnidadMedidaDosis) comboUnidadDosis.getModel().getSelectedItem());
//        actividad.setUnidadMedidaSuperficie( (UnidadMedidaSuperficie) CampoUnidadSuperficie.getModel().getSelectedItem() );
        actividad.setFecha(this.CampoFecha.getDate());
        actividad.setProductos(producto);
//        Chequear producto, si es unll
        
        actividad.setNombreProducto(null != producto ?producto.getNombre():null );
        actividad.setControl( CampoControl.getText() );
        actividad.setPrecioUnitario(new BigDecimal(CampoPrecio.getText()));
        actividad.setDosis(new BigDecimal(CampoDosis.getText()));
        actividad.setSuperficie(new BigDecimal(CampoSuperficie.getText()));
        actividad.setComentarios((CampoComentarios.getText()));
        //Seteando los campos comunes
        
        
        
        
    
    }

}
